﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace SPMS.Utility
{
    /// <summary>
    /// 网络相关的辅助类
    /// </summary>
    /// <remarks>封装了网络相关的方法</remarks>
    /// <history>
    /// [ValentineNing]   平成 21/10/16 15:15    Created
    /// </history>
    public sealed class NetworkUtility
    {
        /// <summary>
        /// 获取指定机器名的IP地址，如果机器名中含有\，则获取第一个\前面字符串的IP地址。
        /// 对于空字符串，.，local，localhost四者直接返回本机IP： 127.0.0.1。
        /// </summary>
        /// <param name="hostName">机器名</param>
        /// <returns>如果找到该名称机器则返回IP地址，否则返回空字符串</returns>
        /// <remarks>本方法没有异常会被抛出，机器找不到或机器名为空会返回空字符串。</remarks>
        /// <history>
        /// [ValentineNing]   平成 21/10/16 15:16    Created
        /// </history>
        public static string GetIpStringFromHostName(string hostName)
        {
            // 判断传入参数的合法性
            if (hostName == null)
            {
                return string.Empty;
            }

            // 去掉反斜线后面的部分（为了兼容使用SQL Server 实例名调用的情况）
            hostName = hostName.Trim().ToLower().Split('\\')[0];

            // 判断是否为本机的代号
            if (hostName == string.Empty || hostName == "." || hostName == "local" || hostName == "localhost")
            {
                return "127.0.0.1";
            }
            else
            {
                string ip = string.Empty;

                try
                {
                    // 获取地址列表
                    IPAddress[] adds = System.Net.Dns.GetHostEntry(hostName).AddressList;

                    // 遍历地址列表
                    foreach (IPAddress add in adds)
                    {
                        // 找到第一个（暂定）符合IPv4命名规范的IP地址并准备返回
                        if (add != null && System.Text.RegularExpressions.Regex.Match(add.ToString(), @"((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)").Success)
                        {
                            ip = add.ToString();
                            break;
                        }
                    }
                }
                catch 
                {
                    // 机器找不到则返回空字符串
                    return string.Empty;
                }

                return ip;
            }
        }

    }
}
